// 1.2.4.数组-相关-从函数返回数组
/**
 * C++ 支持数组数据结构，它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据，但它往往被认为是一系列相同类型的变量。
 * 数组的声明并不是声明一个个单独的变量，比如 number0、number1、...、number99，而是声明一个数组变量，比如 numbers，然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
 * 所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素，最高的地址对应最后一个元素。
 * -----------------
 * 相关
 * 
 * 在 C++ 中，数组是非常重要的，我们需要了解更多有关数组的细节。下面列出了 C++ 程序员必须清楚的一些与数组相关的重要概念
 * 1.多维数组
 *  C++ 支持多维数组。多维数组最简单的形式是二维数组。
 * 2.指向数组的指针
 *  您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。
 * 3.传递数组给函数
 *  您可以通过指定不带索引的数组名称来给函数传递一个指向数组的指针。
 * 4.从函数返回数组
 *  C++ 允许从函数返回数组。
 * 
 * ~~~~~~~~~~~~~~~~~~
 * 从函数返回数组
 * C++ 不允许返回一个完整的数组作为函数的参数。但是，您可以通过指定不带索引的数组名来返回一个指向数组的指针。
 * 如果您想要从函数返回一个一维数组，您必须声明一个返回指针的函数，如下：
    int * myFunction()
    {
    .
    .
    .
    }
 * 
 * 另外，C++ 不支持在函数外返回局部变量的地址，除非定义局部变量为 static 变量。
 * 现在，让我们来看下面的函数，它会生成 10 个随机数，并使用数组来返回它们，具体如下
 * 
*/

#include <iostream>
#include <time.h>
int *get_rand_nums();
int main(void)
{
  // int val[10];
  int *ptr;
  ptr = get_rand_nums();
  for (int i = 0; i < 10; i++)
  {
    // std::cout << "val[" << i << "] : " << *(ptr + i) << std::endl;
    std::cout << "val[" << i << "] : " << ptr[i] << std::endl;
  }
  printf("-----------end-------------\n");
  return 0;
}

int *get_rand_nums()
{
  srand((unsigned)time(NULL));
  const int size = 10;
  // int arr[size];//  warning: address of local variable 'arr' returned [-Wreturn-local-addr] 编不过去

  static int arr[size]; // 不支持返回局部变量的地址，用static
  for (int i = 0; i < size; i++)
  {
    arr[i] = rand() % 11;
  }
  return arr;
}